<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/11
 * Time: 16:30
 */
require_once '../YflAutoLoader.php';

/**
 * Class classHelp
 * @User: yfl
 * @Time:
 * @description: PHP面向对象程序设计之类与反射API详解  尝试封装组建一个class功能类
 * @from http://www.jb51.net/article/98851.htm
 */
interface demo
{
//    public function demo();
}
class test{}

class classHelp  implements demo
{
    public $className;
    public $path;


    /**
     * @param $className :类的文件名字和类的名字要保持一致
     * @param $path :路径
     * @throws Exception
     * @User: yfl
     * @Time: 2017年10月11日 17:20:26
     * @description:检查一个类是否存在
     */
    public static function checkClassIsExists($className, $path)
    {

        if (file_exists($path . $className . '.php') === false) {
            throw new Exception("No such file as $path . $className");
        } else {
            require_once $path . $className . '.php';
        }

        if (class_exists(basename($className, '.php')) == false) {
            throw new Exception("No such class as $path . $className");
        }
    }

    /**
     * @param $obj :某一个对象
     * @param $class :类
     * @throws Exception
     * @User: yfl
     * @Time: 2017年10月12日 08:53:43
     * @description:get_class 检查对象的类 instanceof 验证对象是否属于某个类
     */
    public static function checkObjIsToClass($obj, $class)
    {
        if (get_class($obj) != $class) {
            throw new Exception("not this class $class");
        }
        if ($obj instanceof $class === false) {
            throw new Exception("not instanceof this class $class");
        }
    }

    /**
     * @param $class : 类的名称
     * @param $path : 路径
     * @return array
     * @User: yfl
     * @Time: 2017年10月12日 10:06:47
     * @description:get_class_methods 得到类中所有的方法列表,只获取public的方法
     */
    public static function _get_class_methods($class, $path)
    {
        self::checkClassIsExists($class, $path);
        return get_class_methods($class);
    }

    /**
     * @param $funName
     * @param $class
     * @param $path
     * @return bool
     * @User: yfl
     * @Time:2017年10月12日 10:37:17
     * @description: 检查一个方法是否存在一个类中 public的类型
     */
    public static function checkMethodToClass($funName, $class, $path)
    {
        $publicFunctionArr = self::_get_class_methods($class, $path);
        if (in_array($funName, $publicFunctionArr)) {
            return true;
        } else {
            return false;
        }
    }
    //php函数method_exists()与is_callable()的区别在于在php5中，一个方法存在并不意味着它就可以被调用。
    //对于 private，protected和public类型的方法，method_exits()会返回true，但是is_callable()会检查存在其是否可以访问，如果是private，protected类型的，它会返回false。

    public static function checkIsCallable($obj, $method)
    {
//        if ( method_exists( $obj, $method ) )
//        {
//            /*要操作的代码段*/
//        }
        if (is_callable(array($obj, $method))) {
            return true;
        } else {
            return false;
        }
    }

//is_subclass_of — 如果此对象或者类是该类的子类，则返回 TRUE 这样用法写法没有多大的意义 就当练手了
    public static function a($checkObj, $className)
    {
        if (is_subclass_of($checkObj, $className)) {
            return true;
        } else {
            return false;
        }
    }

}

echo '<pre>';
//var_dump(get_declared_classes());
$classHelp = new classHelp();
$path = dirname(__DIR__) . '\\classOrg\\';
//echo $path;
//$classHelp->checkClassIsExists('http' . '.php', $path);
classHelp::checkObjIsToClass($classHelp, 'classHelp');
$methodArr = classHelp::_get_class_methods('http', $path);
var_dump($methodArr);
classHelp::checkMethodToClass('fileGetContents', 'http', $path);
var_dump(get_class_vars('classHelp'));
//get_class
var_dump(class_implements($classHelp));
